package com.ygp.cas;

/**
 * <Description> <br>
 *
 * @author linmiaolai@sanyygp.com<br>
 * @version 1.0<br>
 * @date 2021/08/30 <br>
 */
public class MyAtomicInteger {
    private volatile int value;

    int getAndIncrement() {
        int newValue;
        int oldVal;
        do {
            oldVal = value;
            newValue = oldVal + 1;
            // cas前跟cas后读取的值不一样  重试一遍
        } while (oldVal != cas(oldVal, newValue));
        return value;
    }


    private synchronized int cas(int expect, int newValue) {
        // 读取当前值
        int curValue = value;
        // 比较目前count值是否==期望值
        if (curValue == expect) {
            // 如果是，则更新count的值  不相等 说明在执行获取value后 执行cas之前  该值已经被修改了
            // 也就是进入cas之前读到的value值跟进入cas之后读的value值不相等
            value = newValue;
        }
        return curValue;
    }

    public int getValue() {
        return value;
    }
}
